/* SQUIB - Scala's Quirky User Interface Builder 
    Copyright (C) 2008 Tim Dalton

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
*/

package tfd.scala.squib.scenario.scenegraph

import com.sun.scenario.scenegraph._
import com.sun.scenario.effect._

import tfd.scala.squib._

//object transforms

trait BuiltEffect[T <: Effect] extends RootTrait with HasDefaultAttributes with HasSetterAttributes {
    def apply(id: String, rest:Any*):T = {
        val effect = doId(id, newEffect())
        processParams(id, rest.elements, effect)
        effect
    }  
    
    def apply(rest:Any*):T = {
        val effect = newEffect()
        processParams(null, rest.elements, effect)
        effect
    }
    
    private def processParams(id:String, parms:Iterator[Any], effect:Effect) = {
        var accumulatedAttrs:Attributes = null
        for (parm <- parms) {
            parm match {
              case attrs:Attributes => doSetters(id, effect, attrs)
              case tup:Tuple2[Symbol, Any] => 
              tup._2 match {
                  case any:Any => {
                      if (accumulatedAttrs == null) {
                          accumulatedAttrs = new Attributes
                      }
                      accumulatedAttrs += tup
                  }
              }
              case unk:Any => throw new Exception(unk.toString + " doesn't represent attributes " + this.getClass)
            }
        }
        if (accumulatedAttrs != null) doSetters(id, effect, accumulatedAttrs)
    }
        
    def newEffect():T
        
    def id(idee: String):T= id[T](idee)
}